import java.util.ArrayList;

public class Estatistica01 extends Estatisticas
{
	ArrayList<Par> quantidadeUsuariosPorTempo = new ArrayList<Par>();
	ArrayList<Par> mediaRodadas = new ArrayList<Par>();
	public int deltaTAtual = 1;
	public int tempoEstavel = 0;
	public double tamDelta = 100;
	double somatorioDelta = 0;
	double mediaTotal;
	double mediaDelta;
	double tempoInicioDelta = 0;
	public int quantEstavel = 0;
	public double tempoAnterior = 0;
	boolean faseTransienteCalculada = false;

	public void armazenarDadosQuantidadeUsuarioPorTempo(double tempo, int quantidade)
	{
		quantidadeUsuariosPorTempo.add(new Par(tempo, quantidade));
	}

	public void calcFaseTransiente(int quantidadeUsuario, double tempoAtual)
	{
		if (tempoInicioDelta == 0) tempoInicioDelta = tempoAtual;
		if (tempoAtual - tempoInicioDelta < tamDelta)
		{
			somatorioDelta += (tempoAtual - tempoAnterior) * quantidadeUsuario;
		}
		else
		{
			mediaDelta = somatorioDelta / (tempoAtual - tempoInicioDelta);
			mediaTotal = (mediaTotal * (deltaTAtual - 1) + mediaDelta) / deltaTAtual;
			if (Math.abs(mediaDelta - mediaTotal) < 1)
			{
				System.out.println("Fim da fase transiente: " + tempoAtual);
				faseTransienteCalculada = true;
			}
			else
			{
				tempoEstavel = 0;
			}

			tempoInicioDelta = 0;
			somatorioDelta = 0;
			deltaTAtual++;
		}
		tempoAnterior = tempoAtual;
	}

	public void calcDaPmfDaRodada()
	{
		double tempoInicio = quantidadeUsuariosPorTempo.get(0).tempo;
		double tempoFim = quantidadeUsuariosPorTempo.get(quantidadeUsuariosPorTempo.size() - 1).tempo;

		ArrayList<Par> tempoTotalPorUsuario = new ArrayList<Par>();
		for (Par p : quantidadeUsuariosPorTempo)
		{
			int index;
			double duracao;
			index = quantidadeUsuariosPorTempo.indexOf(p);
			try
			{
				duracao = quantidadeUsuariosPorTempo.get(index + 1).tempo - p.tempo;
			}
			catch (Exception e)
			{
				duracao = tempoFim - p.tempo;
			}
			p.tempo = duracao;
		}

		for (int i = 0; i <= quantidadeUsuariosPorTempo.size(); i++)
		{
			double tempoI = 0;
			for (int j = 0; j < quantidadeUsuariosPorTempo.size(); j++)
			{
				if (quantidadeUsuariosPorTempo.get(j).quantidadeUsuario == i)
				{
					tempoI += quantidadeUsuariosPorTempo.get(j).tempo;
				}
			}

			double percento = tempoI * 100 / (tempoFim - tempoInicio);
			if (percento > 0.0)
			{
				tempoTotalPorUsuario.add(new Par(percento, i));
			}
		}

		boolean flagAchei = false;
		for (Par p1 : tempoTotalPorUsuario)
		{
			for (Par p2 : mediaRodadas)
			{
				if (p2.quantidadeUsuario == p1.quantidadeUsuario)
				{
					p2.tempo += p1.tempo;
					flagAchei = true;
					break;
				}
			}
			if (!flagAchei)
			{
				mediaRodadas.add(new Par(p1.tempo, p1.quantidadeUsuario));
			}
			flagAchei = false;
		}
		quantidadeUsuariosPorTempo = new ArrayList<Par>();
	}

	public String calcPmfTotal(int quantidadeRodadas)
	{
		String resultado = "";
		for (Par p : mediaRodadas)
		{
			resultado += p.quantidadeUsuario + " " + p.tempo / quantidadeRodadas + "\n";
		}
		return resultado;
	}
}
